package cn.sun.plane.dao.impl;

import cn.sun.plane.dao.CsnDao;
import cn.sun.plane.entity.Csn;
import cn.sun.plane.entity.CsnEntity;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import java.util.List;

public class CsnDaoImpl extends HibernateDaoSupport implements CsnDao {

    private SessionFactory sessionFactory;

    @Override
    //统计个数
    public int findCount() {
        String hql = "select  count(*) from CsnEntity ";
        List<Long> list = this.getHibernateTemplate().find(hql);

        if (list.size() > 0) {
            return list.get(0).intValue();
        }
        return 0;
    }

    @Override
    public int findCountByCsn(Csn csn) {
        DetachedCriteria criteria = getCriteeria(csn);
        Long totalCount = (Long) criteria.setProjection(Projections.rowCount()).getExecutableCriteria(this.getHibernateTemplate().getSessionFactory().getCurrentSession()).uniqueResult();
        return Integer.parseInt(totalCount+"");
    }

    public DetachedCriteria getCriteeria(Csn csn){
        DetachedCriteria criteria = DetachedCriteria.forClass(CsnEntity.class);
//        判断航班号是否为空
        if (csn.getFd1() != null && !"".equals(csn.getFd1())) {
            criteria.add(Restrictions.eq("fd1", csn.getFd1()));
        }
//        判断起飞地点是否为空
        if (csn.getFd4() != null && !"".equals(csn.getFd4())) {
            criteria.add(Restrictions.eq("fd4", csn.getFd4()));
        }
//        判断目的地是否为空
        if (csn.getFd7() != null && !"".equals(csn.getFd7())) {
            criteria.add(Restrictions.or(Restrictions.eq("fd7", csn.getFd7()), Restrictions.eq("fd10", csn.getFd7())));
        }

        String[] splitBegin = csn.getFd23().split("-");
        String[] splitEnd = csn.getFd24().split("-");
//        查询的开始时间必须小于结束时间
        if (Integer.parseInt(splitEnd[0] + splitEnd[1] + splitEnd[2]) > Integer.parseInt(splitBegin[0] + splitBegin[1] + splitBegin[2])) {
            int starttime = Integer.parseInt(splitBegin[1] + splitBegin[2]);
            int endtime = Integer.parseInt(splitEnd[1] + splitEnd[2]);

//            如果是18年
            if (Integer.parseInt(splitBegin[0]) == 2018) {
//                只要查询开始时间小于航班结束时间 或者 查询结束时间大于航班开始时间，由于是18年，航班开始时间小于10月
                criteria.add(Restrictions.or(
                        Restrictions.and(Restrictions.gt("fd24", starttime),
                                Restrictions.lt("fd24",endtime)),
                        Restrictions.and(Restrictions.lt("fd23", endtime > 1000 ? 1000 : endtime),
                                Restrictions.gt("fd23",starttime))));

            } else if (Integer.parseInt(splitEnd[0]) == 2017) {           // 查询开始17年结束也是17年
//                航班开始时间必须大于等于十月，查询的结束时间必须大于航班开始时间。
                criteria.add(Restrictions.and(
                        Restrictions.gt("fd23", 1000),
                        Restrictions.lt("fd23", endtime)));
            }else {           // 查询开始17年 结束18年
//                查询结束时间大于航班开始时间亦可。
                criteria.add(Restrictions.or(Restrictions.gt("fd23", 1000),
                        Restrictions.lt("fd23",endtime)));
            }
        }
        return criteria;
    }

    @Override
    //分页查询的
    public List<CsnEntity> findByPage(int begin, int pageSize) {
        DetachedCriteria criteria = DetachedCriteria.forClass(CsnEntity.class);
        List<CsnEntity> list = this.getHibernateTemplate().findByCriteria(criteria, begin, pageSize);
        return list;
    }

    // 条件查询
    public List<CsnEntity> findByOther(int begin, int pageSize, Csn csn) {
        DetachedCriteria criteria = getCriteeria(csn);
        List<CsnEntity> list = this.getHibernateTemplate().findByCriteria(criteria, begin, pageSize);
        return list;
    }

    // 查询然后下载
    public List<CsnEntity> findByOrderToDowmload(Csn csn) {
        DetachedCriteria criteria = getCriteeria(csn);
        List<CsnEntity> list = this.getHibernateTemplate().findByCriteria(criteria);
        return list;
    }

    @Override
    public void save(CsnEntity csn) {
        this.getHibernateTemplate().save(csn);
    }

    @Override
    public CsnEntity findById(String did) {
        return this.getHibernateTemplate().get(CsnEntity.class, did);
    }

    @Override
    public void update(CsnEntity csn) {
        this.getHibernateTemplate().update(csn);
    }

    @Override
    public void delete(CsnEntity csn) {
        this.getHibernateTemplate().delete(csn);
    }

    @Override
    public List<CsnEntity> findAll() {
        return this.getHibernateTemplate().find("from CsnEntity ");
    }


}
